package h1.sismetro.negocio.funcionario;

import h1.sismetro.classesbasicas.Usuario;
import h1.sismetro.dao.RepositorioUsuarioJDBC;
import h1.sismetro.exceptions.AcessoAoBancoException;
import h1.sismetro.exceptions.ConexaoComBancoException;
import h1.sismetro.exceptions.NenhumUsuarioCadastradoException;
import h1.sismetro.exceptions.UsuarioJaCadastradoException;
import h1.sismetro.exceptions.UsuarioNaoEncontradoException;

public class CadastroUsuario implements ICadastroUsuario {

	private RepositorioUsuarioJDBC repositorioUsuario;
	
	
	public CadastroUsuario(){
		this.repositorioUsuario = new RepositorioUsuarioJDBC();
	}
	
	public CadastroUsuario(RepositorioUsuarioJDBC repositorio){
		this.repositorioUsuario = repositorio;
	}	
	

	//@Override
	public void alterar(Usuario novoUsuario) throws AcessoAoBancoException, ConexaoComBancoException, UsuarioNaoEncontradoException {
		if(this.repositorioUsuario.existe(novoUsuario.getLogin())){
			this.repositorioUsuario.atualizar(novoUsuario);
		}else{
			UsuarioNaoEncontradoException e =
				new UsuarioNaoEncontradoException(novoUsuario.getLogin());
			throw e;
		}			
	}

	//@Override
	public void cadastrar(Usuario novoUsuario) throws AcessoAoBancoException, ConexaoComBancoException, UsuarioJaCadastradoException {
		if(!this.repositorioUsuario.existe(novoUsuario.getLogin())){
			this.repositorioUsuario.inserir(novoUsuario);
		}else{
			UsuarioJaCadastradoException e =
				new UsuarioJaCadastradoException(novoUsuario.getLogin());
			throw e;
		}
		
	}

	//@Override
	public boolean existe(int login) throws AcessoAoBancoException, ConexaoComBancoException{		
		return this.repositorioUsuario.existe(login);
	}
	
//	@Override
	public boolean existe(String matricula) throws AcessoAoBancoException, ConexaoComBancoException{		
		return this.repositorioUsuario.existe(matricula);
	}

	//@Override
	public Usuario recuperar(int login) throws AcessoAoBancoException, ConexaoComBancoException, UsuarioNaoEncontradoException {
		if(this.repositorioUsuario.existe(login)){
			return repositorioUsuario.localizar(login);
		}else{
			UsuarioNaoEncontradoException e =
				new UsuarioNaoEncontradoException(login);
			throw e;
		}
		
	}

	//@Override
	public void excluir(int login) throws AcessoAoBancoException, ConexaoComBancoException, UsuarioNaoEncontradoException{
		if(this.repositorioUsuario.existe(login)){
			this.repositorioUsuario.remover(login);
		}else{
			UsuarioNaoEncontradoException e =
				new UsuarioNaoEncontradoException(login);
			throw e;
		}
		
	}

	//@Override
	public Usuario buscarPorLogon(int login, String senha) throws AcessoAoBancoException, ConexaoComBancoException, NenhumUsuarioCadastradoException {		
		if(!(this.repositorioUsuario.listar().size() <= 0)){
			return this.repositorioUsuario.buscarPorLogon(login,senha);
		}else{
			NenhumUsuarioCadastradoException e =
				new NenhumUsuarioCadastradoException();
			throw e;
		}
	}


	

}
